/** 
 * <pre>项目名称:maven_dome 
 * 文件名称:HttpClientUtil.java 
 * 包名:com.jk.cyd.utils 
 * 创建日期:2022年7月4日下午2:14:12 
 * Copyright (c) 2022, yuxy123@gmail.com All Rights Reserved.</pre> 
 */
package com.dy.utils;

import java.io.Closeable;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

/**
 * <pre>
 * 项目名称：maven_dome    
 * 类名称：HttpClientUtil    
 * 类描述：   
 * 创建人：曹又丹
 * 创建时间：2022年7月4日 下午2:14:12    
 * 修改人：曹又丹
 * 修改时间：2022年7月4日 下午2:14:12    
 * 修改备注：       
 * &#64;version
 * </pre>
 */

public class HttpClientUtil {
	
	static CloseableHttpClient client;

	static {
		client = HttpClients.createDefault();
	}

	public static String get(String url, HashMap<String, Object> map) {
		try {
			//2、创建get对象
			HttpGet get = new HttpGet();
			//3、拼接完成的get请求路径
			//a、hashmap的遍历：获取里面的key和value
			//b、拼接StringBuffer
			StringBuffer strBuf = new StringBuffer();
			strBuf.append(url + "?t=" + System.currentTimeMillis());
			Set<String> keySet = map.keySet();
			for (String string : keySet) {
				strBuf.append("&").append(string).append(map.get(string));
			}
			get.setURI(new URI(strBuf.toString()));
			//4、执行execute方法，发送请求
			CloseableHttpResponse execute = client.execute(get);
			//5、获取请求的状态码
			int statusCode = execute.getStatusLine().getStatusCode();
			//判断请求是否成功
			if (statusCode != 200) {
				return "";
			}
			return EntityUtils.toString(execute.getEntity());
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {//6、关闭连接
			try {
				client.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static String post(String url, HashMap<String, Object> map) {
		try {
			//2、创建get对象
			HttpPost post = new HttpPost();
			//3、拼接完成的get请求路径
			//a、hashmap的遍历：获取里面的key和value
			post.setURI(new URI(url.toString()));
			
			List<NameValuePair> list = new ArrayList<NameValuePair>();
			
			Set<String> keySet = map.keySet();
			for (String key : keySet) {
				BasicNameValuePair basic = new BasicNameValuePair(key, map.get(key).toString());
				list.add(basic);
			}
			
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,"utf-8");
			post.setEntity(entity);
			//4、执行execute方法，发送请求
			CloseableHttpResponse execute = client.execute(post);
			//5、获取请求的状态码
			int statusCode = execute.getStatusLine().getStatusCode();
			//判断请求是否成功
			if (statusCode != 200) {
				return "";
			}
			return EntityUtils.toString(execute.getEntity());
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {//6、关闭连接
			try {
				client.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	  * <pre>post3(post请求，传字符串)   
	  * 创建人：dzy   
	  * 创建时间：2022年7月6日 上午11:38:37    
	  * 修改人：dzy    
	  * 修改时间：2022年7月6日 上午11:38:37    
	  * 修改备注： 
	  * @param url
	  * @param jsonStr
	  * @return</pre>
	  */
	public static String str(String url, String jsonStr) {
		try {
			// 创建post请求对象
			HttpPost httpPost = new HttpPost();
			// 设置路径
			httpPost.setURI(new URI(url));

			// 设置post请求参数
			// 设置content-type属性：application/json： JSON数据格式
			httpPost.addHeader("Content-Type", "application/json");

			StringEntity stringEntity = new StringEntity(jsonStr, "utf-8");
			httpPost.setEntity(stringEntity);

			// 执行：发送请求
			CloseableHttpResponse execute = client.execute(httpPost);
			// 获取请求的状态码
			int statusCode = execute.getStatusLine().getStatusCode();
			if (200 != statusCode) {
				return "";
			}
			return EntityUtils.toString(execute.getEntity(), "utf-8");
		} catch (Exception e) {
			// 6、关闭连接
			try {
				client.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
			return null;
		}
	}
	
	
	
	
	
	/**
	 * <pre>phoneNote(这里用一句话描述这个方法的作用)   
	 * 创建人：曹又丹
	 * 创建时间：2022年7月6日 下午3:11:08    
	 * 修改人：曹又丹
	 * 修改时间：2022年7月6日 下午3:11:08    
	 * 修改备注： 
	 * @param url :发送验证码的请求路径URL
	 * @param app_key :网易云信分配的账号，请替换你在管理后台应用下申请的Appkey
	 * @param app_secret :网易云信分配的密钥，请替换你在管理后台应用下申请的appSecret
	 * @param nonce :随机数
	 * @param templateId :短信模板ID
	 * @param mobile :手机号
	 * @param codelen :验证码长度，范围4～10，默认为4
	 * @return</pre>
	 */
	public static String phoneNote(String url,String app_key,String app_secret,String nonce,String templateId,
			String mobile,String codelen){
		try {
			HttpPost httpPost = new HttpPost(url);
			String curTime = String.valueOf((new Date()).getTime() / 1000L);
			/*
			 * 参考计算CheckSum的java代码，在上述文档的参数列表中，有CheckSum的计算文档示例
			 */
			String checkSum = CheckSumBuilder.getCheckSum(app_secret, nonce, curTime);
			// 设置请求的header
			httpPost.addHeader("AppKey", app_key);
			httpPost.addHeader("Nonce", nonce);
			httpPost.addHeader("CurTime", curTime);
			httpPost.addHeader("CheckSum", checkSum);
			httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
			// 设置请求的的参数，requestBody参数
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			/*
			 * 1.如果是模板短信，请注意参数mobile是有s的，详细参数配置请参考“发送模板短信文档”
			 * 2.参数格式是jsonArray的格式，例如 "['13888888888','13666666666']"
			 * 3.params是根据你模板里面有几个参数，那里面的参数也是jsonArray格式
			 */
			nvps.add(new BasicNameValuePair("templateid", templateId));
			nvps.add(new BasicNameValuePair("mobile", mobile));
			nvps.add(new BasicNameValuePair("codeLen", codelen));
			httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
			// 执行请求
			HttpResponse response = client.execute(httpPost);
			/*
			 * 1.打印执行结果，打印结果一般会200、315、403、404、413、414、500
			 * 2.具体的code有问题的可以参考官网的Code状态表
			 */
			return EntityUtils.toString(response.getEntity(), "utf-8");
		} catch (Exception e) {
			try {
				client.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			throw new RuntimeException(e);
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	public static void main(String[] args) {
		String url = "https://api.netease.im/sms/sendcode.action";
		String  APP_KEY="5c1ed4b46ca53f7fb407f148e69e5268";
		String APP_SECRET="81d99df9d26a";
		String NONCE="123456";
		 //短信模板ID
	    String TEMPLATEID="19518792";
	    //手机号
	     String MOBILE="18403791656";
	    //验证码长度，范围4～10，默认为4
	    String CODELEN="6";
		
		String str = phoneNote(url, APP_KEY, APP_SECRET, NONCE, TEMPLATEID, MOBILE, CODELEN);
		System.err.println(str);
	}
	
	
	
	
	
	

}
